<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
    
        function fn(name) {
            console.log(name);            
        }
    
        //
        fn(123);
        fn('字符串');
        fn(true);
        fn([1,2,3,4,5]);
        fn({name:'刘德华'});

        //函数是复杂数据类型 函数也属于对象
        fn(function(){})

        var fun = function () {}

        fn(fun);

        //函数 可以作为 对象的 属性值（称之为 对象的方法）
        var o = {
            sayHi:function() {
                console.log('hell');                
            }
        }


        //闭包：是为了使外部作用域 能够访问 内部作用域的方式
        // return：没办法满足每次访问 函数内部的 数据都是 同一个
        function foo() {
            var a = 10;
            var b = Math.random();
            return b;
        }

        var num = foo();
        console.log(num);

        var num1 = foo();
        console.log(num1);
        
        //闭包的基本格式
            function foo1() {
                var a = 10;
                var b = Math.random();

                return function fn1() {
                    return b;
                }
                //return fn1;
            }   
            //foo1()();

            var numberFn = foo1();//执行一次

            var number1 = numberFn();
            var number2 = numberFn();

            console.log(number1);
            console.log(number2);

            //结论 闭包可以保证 外部作用域 每次访问函数内部的 数据都是同一个数据；
            //弊端:闭包内部的数据 会被长期持有不会释放，除非当前执行文件关闭
            
             
    </script>
</body>
</html>